import os
import logging
import requests
import os
from flask import Flask, request, jsonify
from flask_cors import CORS
import time

# 配置日志
service_logger = logging.getLogger('dify_api_proxy')
service_logger.setLevel(logging.INFO)

# 创建处理器
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler('dify_api_proxy.log')

# 设置日志格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 添加处理器到logger
service_logger.addHandler(console_handler)
service_logger.addHandler(file_handler)

app = Flask(__name__)
CORS(app)  # 允许跨域请求

# 从环境变量中获取API密钥，如果不存在则使用默认值
dify_api_key = os.environ.get('DIFY_API_KEY', 'app-3cXStNjpVpwNBh2boIIatPyY')
# 基础URL - 指向Dify API的实际地址
base_url = 'http://localhost/v1'

@app.route('/health', methods=['GET'])
def health_check():
    """健康检查接口，用于验证服务是否正常运行"""
    try:
        service_logger.info('健康检查请求')
        return jsonify({'status': 'healthy', 'message': 'Dify API Proxy is running'}), 200
    except Exception as e:
        service_logger.error(f'健康检查失败: {str(e)}')
        return jsonify({'status': 'unhealthy', 'error': str(e)}), 500

# 提供多个路由选项，确保兼容性
@app.route('/chat-messages', methods=['POST'])
@app.route('/v1/chat-messages', methods=['POST'])
@app.route('/api/chat-messages', methods=['POST'])
def proxy_chat_messages():
    """代理聊天消息请求到Dify API"""
    request_id = f"req_{int(time.time() * 1000)}"
    service_logger.info(f'[{request_id}] 收到聊天消息请求')
    
    try:
        # 验证请求内容类型
        if request.content_type != 'application/json':
            service_logger.warning(f'[{request_id}] 无效的Content-Type: {request.content_type}')
            return jsonify({'error': 'Content-Type must be application/json'}), 400
        
        # 解析请求体
        try:
            request_data = request.get_json()
            if not request_data:
                service_logger.warning(f'[{request_id}] 空的请求体')
                return jsonify({'error': 'Request body cannot be empty'}), 400
        except Exception as e:
            service_logger.error(f'[{request_id}] JSON解析失败: {str(e)}')
            return jsonify({'error': 'Invalid JSON format'}), 400
        
        # 记录请求详情（不包含敏感信息）
        service_logger.info(f'[{request_id}] 请求数据: {request_data}')
        
        # 构建目标URL
        target_url = f'{base_url}/chat-messages'
        
        # 构建请求头
        headers = {
            'Authorization': f'Bearer {dify_api_key}',
            'Content-Type': 'application/json',
            # 保留原始请求的其他头信息
            **{key: value for key, value in request.headers if key.lower() not in ['authorization', 'content-type']}
        }
        
        # 转发请求到Dify API
        service_logger.info(f'[{request_id}] 转发请求到: {target_url}')
        response = requests.post(
            target_url,
            headers=headers,
            json=request_data,
            timeout=30  # 设置超时时间
        )
        
        # 记录响应状态
        service_logger.info(f'[{request_id}] Dify API响应状态码: {response.status_code}')
        
        # 将API响应原样返回给前端
        try:
            response_data = response.json()
            return jsonify(response_data), response.status_code
        except ValueError:
            # 如果响应不是有效的JSON
            service_logger.warning(f'[{request_id}] Dify API返回非JSON响应')
            return response.text, response.status_code
            
    except requests.exceptions.RequestException as e:
        # 处理请求异常
        error_msg = f'请求Dify API失败: {str(e)}'
        service_logger.error(f'[{request_id}] {error_msg}')
        return jsonify({'error': error_msg}), 500
    except Exception as e:
        # 处理其他异常
        error_msg = f'处理请求时发生未知错误: {str(e)}'
        service_logger.error(f'[{request_id}] {error_msg}')
        return jsonify({'error': error_msg}), 500

@app.errorhandler(404)
def not_found(error):
    """处理404错误"""
    service_logger.warning(f'请求了不存在的端点: {request.path}')
    return jsonify({'error': 'Endpoint not found'}), 404

@app.errorhandler(405)
def method_not_allowed(error):
    """处理405错误"""
    service_logger.warning(f'不允许的请求方法 {request.method} 访问端点: {request.path}')
    return jsonify({'error': 'Method not allowed'}), 405

if __name__ == '__main__':
    # 在生产环境中，应该使用Gunicorn或uWSGI等WSGI服务器
    # 这里使用Flask内置服务器仅用于开发和测试
    debug_mode = os.environ.get('FLASK_DEBUG', 'False').lower() == 'true'
    service_logger.info(f'启动Dify API代理服务，调试模式: {debug_mode}')
    app.run(host='0.0.0.0', port=8000, debug=debug_mode)